package com.southgis.ibase.sql.enums;

import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.southgis.ibase.sql.utils.DatabaseUtil;

/**
 * 数据库类型名。<br>
 * 相应驱动类、url格式、方言类，通过配置获取。
 * @version 1.0
 * @date 2019/8/4
 */
public class DataSourceType {

	/** 大数据：kudu */
	public static final String KUDU="kudu";

	/** 非关系数据库：mongodb */
	public static final String MONGODB="mongodb";
	
	public static final String ORACLE="oracle";
	
	public static final String MYSQL="mysql";
	
	public static final String POSTGRESQL="postgresql";
	
	public static final String DM="dm";
	
	public static final String KINGBASE="kingbase";

	/**
	 * 根据数据库驱动名称或连接串，分析数据库类型，在DataSourceType中定义的字符串。<br>
	 * 如果未找到，返回空字符串（""），不会返回null。<br>
	 * 驱动类名或连接串，二选一即可，如果不确定通过哪种信息可得到类型时，两个内容都传递。
	 * @param driverClass 驱动类名。可以传入null，表示忽略
	 * @param url 数据库连接串。可以传入null，表示忽略
	 * @return
	 */
	public static String ofByDriverOrUrl(String driverClass, String url) {
		
		if(driverClass==null)
			driverClass="";
		else
			driverClass=driverClass.trim().toLowerCase();
		if(url==null)
			url="";
		else {
			int pos=url.indexOf("//");//去除后面的地址及参数信息
			if(pos>0) {
				url=url.substring(0,pos);
			}
			url=url.trim().toLowerCase();
		}
		
		//(dennis)从配置中获取所有支持数据库类型名（如果不在支持列表中，视为找不到）
		List<String> typeNames=DatabaseUtil.getDsTemplateProp().gainDefineTemplateTypes();
		for(String item:typeNames) {
			if (StringUtils.isEmpty(item)) {
				continue;
			}
			int pos,next;
			if(!driverClass.isEmpty()) {
				next=0;
				do {
					pos=driverClass.indexOf(item,next);
					if(pos>=0) {
						next=pos+item.length();
						if(pos==0 || !Character.isLetter(driverClass.charAt(pos-1))) {
							if(next==driverClass.length() || !Character.isLetter(driverClass.charAt(next)))
								return item;
						}
					}
				}while(pos>=0 && next<driverClass.length());
			}

			if(!url.isEmpty()) {
				next=0;
				do {
					pos=url.indexOf(item,next);
					if(pos>=0) {
						next=pos+item.length();
						if(pos==0 || !Character.isLetter(url.charAt(pos-1))) {
							if(next==url.length() || !Character.isLetter(url.charAt(next)))
								return item;
						}
					}
				}while(pos>=0 && next<url.length());
			}
		}
		return "";
	}

	/**
	 * 通过数据库驱动类名，分析数据库类型名。如果未找到，返回空字符串（""），不会返回null
	 * @param driverClass
	 * @return
	 */
	public static String ofByDriver(String driverClass){
		return ofByDriverOrUrl(driverClass, null);
	}

	public static boolean isOracle(String typeName){
		return DataSourceType.ORACLE.equalsIgnoreCase(typeName);
	}

	public static boolean isMysql(String typeName){
		return DataSourceType.MYSQL.equalsIgnoreCase(typeName);
	}

	public static boolean isPostgresql(String typeName){
		return DataSourceType.POSTGRESQL.equalsIgnoreCase(typeName);
	}
	
	/**
	 * 判断类型是否相等，如果其中之一为null，则总不相等
	 * @param typeName
	 * @param target
	 * @return
	 */
	public static boolean typeEquals(String typeName, String target)
	{
		if(typeName==null) return false;
		return typeName.equalsIgnoreCase(target);
	}
}
